import {
  Controller,
  Post,
  Get,
  Put,
  Delete,
  Body,
  Param,
  Query,
  UseGuards,
  Request,
} from '@nestjs/common';
import { PlaylistService } from './playlist.service';
import {
  CreatePlaylistDto,
  UpdatePlaylistDto,
  PlaylistResponseDto,
  PlaylistWithSongsDto,
} from './playlist.dto';
import { AuthGuard } from '@nestjs/passport';

/**
 * 播放列表控制器
 * 处理播放列表相关的HTTP请求
 */
@Controller('playlists')
export class PlaylistController {
  constructor(private readonly playlistService: PlaylistService) {}

  /**
   * 创建新的播放列表
   * @param createPlaylistDto 创建播放列表的数据
   * @param req 请求对象，包含当前登录用户信息
   * @returns 创建的播放列表响应数据
   */
  @UseGuards(AuthGuard('jwt')) // 需要JWT身份验证
  @Post()
  async createPlaylist(
    @Body() createPlaylistDto: CreatePlaylistDto,
    @Request() req,
  ): Promise<PlaylistResponseDto> {
    const userId = req.user.id; // 从JWT中获取用户ID
    return this.playlistService.createPlaylist(createPlaylistDto, userId);
  }

  /**
   * 获取播放列表列表
   * @param userId 可选的用户ID，用于筛选特定用户的播放列表
   * @returns 播放列表响应数据数组
   */
  @Get()
  async findAllPlaylists(
    @Query('userId') userId?: number,
  ): Promise<PlaylistResponseDto[]> {
    return this.playlistService.findAllPlaylists(userId);
  }

  /**
   * 获取官方推荐播放列表
   * @param limit 限制返回的播放列表数量，默认10
   * @returns 官方推荐播放列表响应数据数组
   */
  @Get('official')
  async findOfficialPlaylists(
    @Query('limit') limit: number = 10,
  ): Promise<PlaylistResponseDto[]> {
    return this.playlistService.findOfficialPlaylists(limit);
  }

  /**
   * 根据ID查找播放列表
   * @param id 播放列表ID
   * @param includeSongs 是否包含歌曲详情（默认为false）
   * @returns 播放列表响应数据，可能包含歌曲列表
   */
  @Get(':id')
  async findOne(
    @Param('id') id: number,
    @Query('includeSongs') includeSongs: boolean = false,
  ): Promise<PlaylistResponseDto | PlaylistWithSongsDto> {
    return this.playlistService.findPlaylistById(id, includeSongs);
  }

  /**
   * 更新播放列表信息
   * @param id 播放列表ID
   * @param updatePlaylistDto 更新的播放列表数据
   * @returns 更新后的播放列表响应数据
   */
  @UseGuards(AuthGuard('jwt')) // 需要JWT身份验证
  @Put(':id')
  async update(
    @Param('id') id: number,
    @Body() updatePlaylistDto: UpdatePlaylistDto,
  ): Promise<PlaylistResponseDto> {
    return this.playlistService.updatePlaylist(id, updatePlaylistDto);
  }

  /**
   * 删除播放列表
   * @param id 播放列表ID
   */
  @UseGuards(AuthGuard('jwt')) // 需要JWT身份验证
  @Delete(':id')
  async delete(@Param('id') id: number): Promise<void> {
    return this.playlistService.deletePlaylist(id);
  }

  /**
   * 向播放列表添加歌曲
   * @param playlistId 播放列表ID
   * @param songId 歌曲ID
   * @returns 更新后的包含歌曲的播放列表响应数据
   */
  @UseGuards(AuthGuard('jwt')) // 需要JWT身份验证
  @Post(':playlistId/songs/:songId')
  async addSongToPlaylist(
    @Param('playlistId') playlistId: number,
    @Param('songId') songId: number,
  ): Promise<PlaylistWithSongsDto> {
    return this.playlistService.addSongToPlaylist(playlistId, songId);
  }

  /**
   * 从播放列表移除歌曲
   * @param playlistId 播放列表ID
   * @param songId 歌曲ID
   * @returns 更新后的包含歌曲的播放列表响应数据
   */
  @UseGuards(AuthGuard('jwt')) // 需要JWT身份验证
  @Delete(':playlistId/songs/:songId')
  async removeSongFromPlaylist(
    @Param('playlistId') playlistId: number,
    @Param('songId') songId: number,
  ): Promise<PlaylistWithSongsDto> {
    return this.playlistService.removeSongFromPlaylist(playlistId, songId);
  }

  /**
   * 切换播放列表点赞状态
   * @param id 播放列表ID
   * @returns 点赞数和点赞状态
   */
  @UseGuards(AuthGuard('jwt')) // 需要JWT身份验证
  @Post(':id/like')
  async likePlaylist(
    @Param('id') id: number,
  ): Promise<{ likes: number; isLiked: boolean }> {
    return this.playlistService.toggleLike(id);
  }
}
